package negocio;

import java.util.*;
import java.util.Date;
import persistencia.PersistenciaCliente;
import persistencia.PersistenciaPromocion;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 * Clase controladora entre la Vista, la logica de Negocio y la Persistencia de las promociones
 * @author JAVA
 */
public class GestionPromociones {

    /**
     * Recibe los datos de una promocion, crea un objeto promocion y lo manda a la Persistencia para que lo inserte en la BBDD
     * @param descripcion
     * @param porcentaje
     * @param dias
     * @param fechaInicio
     * @param fechaFin
     * @param tipo
     * @param descripcionTipo 
     */
    public static void addPromocion(String descripcion, float porcentaje, int dias, Date fechaInicio, Date fechaFin, Tipo tipo, String descripcionTipo) {
        try {
            Promocion p = new Promocion(descripcion, porcentaje, dias, fechaInicio, fechaFin, tipo, descripcionTipo);
            if (persistencia.PersistenciaPromocion.insertarPromocion(p) == 1) {
                System.out.println("Promocion insertada correctamente");
            } else {
                System.out.println("La promocion no fue insertada");
            }
        } catch (Exception ex) {
            System.out.println("Error en la introduccion en la BBDD");
        }

    }

    public static void informarPromociones() {
        List<Promocion> prom = PersistenciaPromocion.mostrarPromocionesVigentes();
        List<Cliente> clientes = PersistenciaCliente.obtenerClientes();
        if (!prom.isEmpty()) {
            Iterator itC = clientes.iterator();
            Iterator itP = prom.iterator();
            String cadenaPromociones = "Video Club Cibernos os informa de las siguientes promociones en la actualidad";
            while (itP.hasNext()) {
                Promocion p = (Promocion) itP.next();
                cadenaPromociones += "\n\nPromocion " + p.getDescripcion();
                cadenaPromociones += "\nFecha de inicio: " + p.getFechaInicio().toString();
                cadenaPromociones += "\nFecha de fin: " + p.getFechaFin().toString();
                cadenaPromociones += "\nTipo de promocion: " + p.getT().toString();
                cadenaPromociones += "\nAplicable a: " + p.getDescripcionTipo();
                cadenaPromociones += "\nCon un porcentaje de descuento de: " + p.getPorcentaje() + "%";
                cadenaPromociones += "\nDias extra de alquiler: " + p.getDias();
            }
            cadenaPromociones += "\n\nAprovéchelas y acérquese por su videoclub de confianza";
            while (itC.hasNext()) {
                Cliente c = (Cliente) itC.next();
                String mail = c.getEmail();
                MailSender.send(mail, "Promociones actuales", false, cadenaPromociones);
                
            }
        }
        else{
            System.out.println("No hay promociones vigentes");
        }
    }

    /**
     * Recibe un codigo de la promocion y mediante una llamada a la persistencia lo elimina
     * @param codigo de la promocion a eliminar
     */
    public static void borrarPromocion(int codigo) {
        if (PersistenciaPromocion.bajaPromocion(codigo) == 1) {
            System.out.println("Promocion eliminada correctamente");
        } else {
            System.out.println("Promocion NO eliminada, verifique el id de la promocion");
        }

    }

    /**
     * Llama a la persistencia y recibe una lista con promociones y las muestra por pantalla
     * @return un entero con el numero de promociones existentes
     */
    public static int mostrarPromociones() {
        List<Promocion> prom = PersistenciaPromocion.mostrarPromociones();
        Iterator it = prom.iterator();
        System.out.println("---------------------------");
        System.out.println("Numero de promociones: " + prom.size());
        System.out.println("---------------------------");
        while (it.hasNext()) {
            Promocion p = (Promocion) it.next();
            System.out.println("Id: " + p.getId());
            System.out.println("Descripcion: " + p.getDescripcion() + " Porcentaje: " + p.getPorcentaje() + " Dias extra: " + p.getDias());
            System.out.println("Fecha de Inicio: " + p.getFechaInicio().toString());
            System.out.println("Fecha de fin: " + p.getFechaFin().toString());
            System.out.println("Tipo: " + p.getT().toString() + " Descripcion: " + p.getDescripcionTipo());
            System.out.println("---------------------------");
        }
        return prom.size();
    }

    /**
     * Recibe de la persistencia una lista de promociones actualmente inactivas
     * Recorre dicha lista para imprimir las promociones 
     * @return un entero con el tamaño de la lista de promociones
     */
    public static int mostrarPromocionesInactivas() {
        List<Promocion> prom = PersistenciaPromocion.mostrarPromocionesInactivas();
        Iterator it = prom.iterator();
        System.out.println("---------------------------");
        System.out.println("Numero de promociones: " + prom.size());
        System.out.println("---------------------------");
        while (it.hasNext()) {
            Promocion p = (Promocion) it.next();
            System.out.println("Id: " + p.getId());
            System.out.println("Descripcion: " + p.getDescripcion() + " Porcentaje: " + p.getPorcentaje() + " Dias extra: " + p.getDias());
            System.out.println("Fecha de Inicio: " + p.getFechaInicio().toString());
            System.out.println("Fecha de fin: " + p.getFechaFin().toString());
            System.out.println("Tipo: " + p.getT().toString() + " Descripcion: " + p.getDescripcionTipo());
            System.out.println("---------------------------");
        }
        return prom.size();
    }

    /**
     * Recibe un codigo de la promocion escogida para reactivarla y la pone de nuevo activa
     * @param codigo de la promocion a reactivar
     */
    public static void reactivarPromocion(int cod) {

        if (PersistenciaPromocion.reactivarPromociones(cod) == 1) {
            System.out.println("Promocion reactivada correctamente");
        } else {
            System.out.println("La promocion no fue reactivada");
        }

    }

    /**
     * Carga una lista de promociones de la persistencia cuya fecha de fin es inferior a la fecha actual
     * Recorre dicha lista y la muestra por pantalla
     * @return un entero con el numero de promociones en la lista
     */
    public static int mostrarPromocionesVigentes() {
        List<Promocion> prom = PersistenciaPromocion.mostrarPromocionesVigentes();
        Iterator it = prom.iterator();
        System.out.println("---------------------------");
        System.out.println("Numero de promociones: " + prom.size());
        System.out.println("---------------------------");
        while (it.hasNext()) {
            Promocion p = (Promocion) it.next();
            System.out.println("Id: " + p.getId());
            System.out.println("Descripcion: " + p.getDescripcion() + " Porcentaje: " + p.getPorcentaje() + " Dias extra: " + p.getDias());
            System.out.println("Fecha de Inicio: " + p.getFechaInicio().toString());
            System.out.println("Fecha de fin: " + p.getFechaFin().toString());
            System.out.println("Tipo: " + p.getT().toString() + " Descripcion: " + p.getDescripcionTipo());
            System.out.println("---------------------------");
        }
        return prom.size();
    }

    /**
     * Metodo para modificar un atributo de la promocion y establecer su nuevo valor
     * @param nombre del campo a modificar
     * @param valor nuevo a introducir
     * @return 1 si se modifica correctamente
     */
    public static void modificarGenerico(int cod, String nombre, String valor) {
        if (PersistenciaPromocion.modificarCampos(cod, nombre, valor) == 1) {
            System.out.println("Campo modificado correctamente");
        } else {
            System.out.println("Modificacion no realizada");
        }
    }

    /**
     * 
     * @param codigo de la promocion a modificar
     * @param fecha a insertar como nueva fecha de fin
     */
    public static void modificarFechaFin(int cod, Date fecha) {
        if (PersistenciaPromocion.modificarFechaFin(cod, fecha) == 1) {
            System.out.println("Fecha modificada correctamente");
        } else {
            System.out.println("Modificacion no realizada");
        }
    }

    /**
     * 
     * @param codigo de la promocion a modificar
     * @param fecha a insertar como nueva fecha de inicio
     */
    public static void modificarFechaInicio(int cod, Date fecha) {
        if (PersistenciaPromocion.modificarFechaInicio(cod, fecha) == 1) {
            System.out.println("Fecha modificada correctamente");
        } else {
            System.out.println("Modificacion no realizada");
        }
    }
}
